import { mergeOptions } from "../util";
export function initGlobalAPI(Vue) {
  Vue.options = {}; // 存储全局 options

  // filter  component directive 等 api
  Vue.mixin = function (mixin) {
    this.options = mergeOptions(this.options, mixin);
    log(this.options);
    return this;
  };
  Vue.options._base = Vue;
  Vue.options.components = {}; // 存放全局组件的构造函数

  // id 组件名
  Vue.component = function (id, definition) {
    definition.name = definition.name || id;
    definition = this.options._base.extend(definition); // 生成一个构造函数
    this.options.components[id] = definition;
  };
  let cid = 0;
  Vue.extend = function (options) {
    const Super = this;
    const Sub = function VueComponent(options = {}) {
      this._init(options); // Sub 原型 Super 上有 _init 方法
    };
    Sub.cid = cid++;
    Sub.prototype = Object.create(Super.prototype); //  Super.prototype.constructor === Super
    Sub.prototype.constructor = Sub; // 构造函数修正，否则指向 Super
    Sub.component = Super.component;
    // 将 Vue 的options 和自身的 options 合并
    Sub.options = mergeOptions(Super.options, options);
    log(Sub.options);
    return Sub; // 根据 options 得到一个 构造函数，可以继续传入 options 得到一个组件
  };
}
